﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Business;
using Business.Dicionary;
using Business.Entity.Contabil.Pessoa;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario.ClassesRelacionadas;
using Business.Entity.Sistema;
using Business.Forms;
using Business.Seguranca;
using Business.Validation;
using DevExpress.XtraEditors;

namespace Bonesoft.Forms.Sistema
{
    public partial class FormUsuario : FormDefault, IForm
    {
        public FormUsuario()
        {
            InitializeComponent();
            
            tipoPessoaDicionaryBindingSource.DataSource = new TipoPessoaDicionary();
            sexoDicionaryBindingSource.DataSource = new SexoDicionary();
            tipoUsuarioDicionaryBindingSource.DataSource = new TipoUsuarioDicionary();
            PerfilRepository.Session = UsuarioRepository.GetSession();
            perfilBindingSource.DataSource = PerfilRepository.GetList();
            InitFocusControl = cpfCnpjTextEdit;

        }

        private void cpfCnpjTextEdit_Properties_Leave(object sender, System.EventArgs e)
        {

        }

        public object Novo()
        {
            var u = new Usuario();
            CurrentObject = u;
            txtSenha.Enabled = true;
            cmdAlterarSenha.Visible = false;
            grpAlterarSenha.Visible = false;
            ShowDialog();
            if (u.Id == 0)
            {
                return null;
            }
            return u;
        }

        public void Alterar(object entity)
        {
            var usr = (Usuario) entity;
            if (usr.PermissoesFormulario == null)
            {
                usr.PermissoesFormulario = new List<PermissaoForm>();
            }
            if (usr.PermissoesRelatorio == null)
            {
                usr.PermissoesRelatorio = new List<PermissaoRelatorio>();
            }
            CurrentObject = entity;
            txtSenha.Enabled = false;
            cmdAlterarSenha.Visible = true;
            grpAlterarSenha.Visible = false;
            ShowDialog();
        }

        private void perfilGridLookUp_EditValueChanged(object sender, System.EventArgs e)
        {
            var perfil = (Perfil)perfilGridLookUp.EditValue;
            permissoesFormularioBindingSource.Clear();
            permissoesRelatorioBindingSource.Clear();


            foreach (var permissaoForm in perfil.PermissoesFormulario)
            {
                var permissao = new PermissaoForm()
                {
                    Formulario = permissaoForm.Formulario,
                    PermissaoAcesso = permissaoForm.PermissaoAcesso,
                    PermissaoDelete = permissaoForm.PermissaoDelete,
                    PermissaoInsert = permissaoForm.PermissaoInsert,
                    PermissaoSelect = permissaoForm.PermissaoSelect,
                    PermissaoUpdate = permissaoForm.PermissaoUpdate
                };
                permissoesFormularioBindingSource.Add(permissao);
            }
            foreach (var permissaoRelatorio in perfil.PermissoesRelatorio)
            {
                var permissao = new PermissaoRelatorio()
                {
                    Relatorio = permissaoRelatorio.Relatorio,
                    Habilitado = permissaoRelatorio.Habilitado
                };
                permissoesRelatorioBindingSource.Add(permissao);
            }
            permissoesFormularioBindingSource.ResumeBinding();
            permissoesRelatorioBindingSource.ResumeBinding();
        }

        
        private void cpfCnpjTextEdit_Leave(object sender, System.EventArgs e)
        {
            var usuario = UsuarioRepository.GetUniqueByCpfCnpj(cpfCnpjTextEdit.Text);
            if (usuario != null)
            {
                MessageBox.Show("Já existe um fornecedor cadastrado com esse CPF/CNPJ.");
                cpfCnpjTextEdit.Focus();
                return;
            }
            var pessoa = PessoaRepository.GetUniqueByCpfCnpj(cpfCnpjTextEdit.Text);
            if (pessoa != null)
            {
                ((Usuario)usuarioBindingSource.Current).Pessoa = UsuarioRepository
                    .GetSession().Get<Pessoa>(pessoa.Id);
            }
        }

        public object Save()
        {
            if (!Validate().HasError)
            {
                var u = (Usuario)usuarioBindingSource.Current;
                if (grpAlterarSenha.Visible && !txtSenhaAtual.Text.Equals(""))
                {
                    var novaSenha = new Criptografia.CriptHash().GetHash(txtSenhaAtual.Text);
                    if (novaSenha.Equals(u.Senha))
                    {
                        if (txtNovaSenha.Text.Equals(txtConfirmaSenha.Text))
                        {
                            u.Senha = new Criptografia.CriptHash().GetHash(txtNovaSenha.Text);
                        }
                        else
                        {
                            MessageBox.Show("A nova senha não confere.\n Por favor tente novamente.");
                            return CurrentObject;
                        }
                    }
                    else
                    {
                        MessageBox.Show("A senha atual não confere.\n Por favor tente novamente.");
                        return CurrentObject;
                    }
                }
                if (u.Pessoa.Id == 0)
                {
                    UsuarioRepository.GetSession().Save(u.Pessoa);
                }
                if (!cmdAlterarSenha.Visible || u.Id == 0)
                {
                    u.Senha = new Criptografia.CriptHash().GetHash(u.Senha);
                }
                UsuarioRepository.Save(u);
            }
            return CurrentObject;
        }

        public void Update(object entity)
        {
            Alterar(entity);
        }

        public bool Delete(object entity)
        {
            CurrentObject = entity;
            UsuarioRepository.Delete((Usuario) entity);
            return true;
        }


        public object CurrentObject
        {
            get
            {
                usuarioBindingSource.EndEdit();
                return usuarioBindingSource.DataSource;
            }
            set
            {
                usuarioBindingSource.DataSource = value;
            }
        }

        public PermissaoForm Permissao
        {
            get
            {
                return SegurancaUtils.GetPermissaoForm(Name);
            }
        }

        public EntityValidationResult Validate()
        {
            var u = (Usuario) CurrentObject;
            var result = DataValidation.ValidateEntity(u);
            foreach (var error in DataValidation.ValidateEntity(u.Pessoa).ValidationErrors)
            {
                result.ValidationErrors.Add(error);
            }
            return result;
        }

        public void Reload()
        {
            
        }

        public void Cancel()
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }

        public Object New()
        {
            return Novo();
        }

        public XtraForm Form
        {
            get
            {
                return this;
            }
        }

        public FormState FormState { get; set; }

        private void cmdAlterarSenha_Click(object sender, System.EventArgs e)
        {
            cmdAlterarSenha.Visible = false;
            grpAlterarSenha.Visible = true;
        }

        private void FormUsuario_Deactivate(object sender, System.EventArgs e)
        {
            grpAlterarSenha.Visible = false;
            cmdAlterarSenha.Visible = true;
        }
    }
}